package cc.owoo.godpen.reflect;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * class与泛型
 * Created by nimensei
 * 2022-06-04 上午 12:48
 */
public record ClassType(Type type, Class<?> rowType, ParameterizedType parameterizedType) {
    /**
     * 获取泛型类型
     *
     * @param index 泛型类型的位置
     * @return 泛型类型
     */
    public Type getGenericType(int index) {
        if (index <= 0 || parameterizedType == null)
            return null;
        Type[] types = parameterizedType.getActualTypeArguments();
        if (types == null || types.length <= index)
            return null;
        return types[index];
    }

    /**
     * 根据传入的类型对象获取原对象类型以及原对象的泛型
     *
     * @param type 类型对象
     * @return class与反射类型
     */
    public static ClassType create(Type type) {
        Class<?> rowType;
        ParameterizedType parameterized;
        if (type instanceof Class<?> cls) {
            rowType = cls;
            parameterized = null;
        } else if (type instanceof ParameterizedType parameterizedType) {
            if (!(parameterizedType.getRawType() instanceof Class<?> c))
                return null;
            rowType = c;
            parameterized = parameterizedType;
        } else
            return null;
        return new ClassType(type, rowType, parameterized);
    }
}
